package com.alibaba.simpleimage.analyze.harissurf;

public class GaussianConstants {
	
	/**
	 * 7 x 7 Discrete Gaussian Distribution, sigma = 2.5
	 */
	public static final double[][] Gauss25 = {
		  { 0.02546481,   0.02350698,     0.01849125,     0.01239505,     0.00708017,     0.00344629,     0.00142946 },
		  { 0.02350698,   0.02169968,     0.01706957,     0.01144208,     0.00653582,     0.00318132,     0.00131956 },
		  { 0.01849125,   0.01706957,     0.01342740,     0.00900066,     0.00514126,     0.00250252,     0.00103800 },
		  { 0.01239505,   0.01144208,     0.00900066,     0.00603332,     0.00344629,     0.00167749,     0.00069579 },
		  { 0.00708017,   0.00653582,     0.00514126,     0.00344629,     0.00196855,     0.00095820,     0.00039744 },
		  { 0.00344629,   0.00318132,     0.00250252,     0.00167749,     0.00095820,     0.00046640,     0.00019346 },
		  { 0.00142946,   0.00131956,     0.00103800,     0.00069579,     0.00039744,     0.00019346,     0.00008024 }
	};

	public static double[][] getGaussianDistribution(int sampleCount, float range, float sigma){
		double[][] distribution = new double[sampleCount][sampleCount];
		double sigmaSquared = Math.pow(sigma,2);
		double inverseTwoPiSigmaSquared = 1 / (2 * Math.PI * sigmaSquared);
		for ( int i = 0; i < sampleCount; i++ ){
			for ( int j = 0; j < sampleCount; j++ ){
				double x = (range / (sampleCount-1)) * i;
				double y = (range / (sampleCount-1)) * j;
				double power = Math.pow(x,2)/(2*sigmaSquared) + Math.pow(y,2)/(2*sigmaSquared);
				distribution[i][j] = inverseTwoPiSigmaSquared * Math.pow(Math.E,-1*power);
			}
		}
		return distribution;
	}
	
	public static void main(String args[]){
		double[][] dist = getGaussianDistribution(7,5.5F,2.5F);
		for ( double[] row : dist ){
			for ( double value : row ){
				System.out.format("%.14f,",value);
			}
			System.out.println("");
		}
	}
}
